package common.util;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class GsonUtil {
	private GsonUtil() {
	}

	/**
	 * 根据对象生成JSON字符串
	 * 
	 * @param object对象
	 * @return JSON字符串
	 */
	public static String getJson(Object cObj) {
		Gson tGson = new Gson();
		return tGson.toJson(cObj);
	}

	/**
	 * 解析JSON字符串获取实体
	 * 
	 * @param jsonString字符串
	 * @param cls实体类型
	 * @return实体实例
	 */
	public static <T> T getEntity(String cJson, Class<T> cCls) {
		Gson tGson = new Gson();
		return tGson.fromJson(cJson, cCls);
	}

	/**
	 * 解析JSON获取Object
	 * 
	 * @param cJson字符串
	 * @return键值对集合实例
	 */
	public static <T> T getObject(String cJson, JsonType<T> cType) {
		return JSON.parseObject(cJson, cType);
	}

	/**
	 * 解析JSON获取实体集合
	 * 
	 * @param cJson字符串
	 * @param cCls实体类型
	 * @return集合实例
	 */
	public static <T> List<T> getList(String cJson, Class<T> cCls) {
		Gson tGson = new Gson();
		Type type = new TypeToken<List<T>>() {
		}.getType();
		return tGson.fromJson(cJson, type);
	}

	/**
	 * 解析JSON获取键值对
	 * 
	 * @param cJson字符串
	 * @return键值对实例
	 */
	public static <K, V> Map<K, V> getMap(String cJson, Class<K> cK, Class<V> cV) {
		Gson tGson = new Gson();
		Type type = new TypeToken<Map<K, V>>() {
		}.getType();
		return tGson.fromJson(cJson, type);
	}

	/**
	 * 解析JSON获取键值对集合
	 * 
	 * @param cJson字符串
	 * @return键值对集合实例
	 */
	public static <K, V> List<Map<K, V>> getListMap(String cJson, Class<K> cK, Class<V> cV) {
		Gson tGson = new Gson();
		Type type = new TypeToken<List<Map<K, V>>>() {
		}.getType();
		return tGson.fromJson(cJson, type);
	}

	/**
	 * 解析JSON获取键值对
	 * 
	 * @param cJson字符串
	 * @return键值对实例
	 */
	public static Map<String, Object> getMapObject(String cJson) {
		return getMap(cJson, String.class, Object.class);
	}

	/**
	 * 解析JSON获取键值对集合
	 * 
	 * @param cJson字符串
	 * @return键值对集合实例
	 */
	public static List<Map<String, Object>> getListMapObject(String cJson) {
		return getListMap(cJson, String.class, Object.class);
	}

	/**
	 * 解析JSON获取键值对
	 * 
	 * @param cJson字符串
	 * @return键值对实例
	 */
	public static Map<String, String> getMapStr(String cJson) {
		return getMap(cJson, String.class, String.class);
	}

	/**
	 * 解析JSON获取键值对集合
	 * 
	 * @param cJson字符串
	 * @return键值对集合实例
	 */
	public static List<Map<String, String>> getListMapStr(String cJson) {
		return getListMap(cJson, String.class, String.class);
	}
}
